#ifndef VIRTUALLISTMANAGER_H
#define VIRTUALLISTMANAGER_H

#include <QObject>
#include <QList>
#include <QMap>
#include <QRect>

class CustomFileItem;
class QVBoxLayout;

/**
 * VirtualListManager - 虚拟化列表管理器
 * 
 * 核心思想：
 * 1. 维护固定的Item池（20-100个）
 * 2. Item永不删除，只重新绑定数据
 * 3. 滚动时动态绑定可见区域的Item
 * 4. 支持1000+文件的大列表
 * 
 * 优势：
 * - 零崩溃（item永不删除）
 * - 极致性能（item复用）
 * - 代码简洁（无复杂事件处理）
 */
class VirtualListManager : public QObject
{
    Q_OBJECT

public:
    // === 配置参数 ===
    static constexpr int MIN_POOL_SIZE = 20;        // 最小池大小
    static constexpr int MAX_POOL_SIZE = 100;       // 最大池大小
    static constexpr int BUFFER_ITEMS = 10;         // 缓冲区大小（上下各10个）
    static constexpr int DEFAULT_ITEM_HEIGHT = 50;  // 默认item高度

    explicit VirtualListManager(QObject* parent = nullptr);
    ~VirtualListManager();

    // === 池管理 ===
    int getPoolSize() const { return m_poolSize; }
    int getOptimalPoolSize(int windowHeight, int itemHeight = DEFAULT_ITEM_HEIGHT) const;
    void adjustPoolSize(int newSize);
    
    // === 可见范围计算 ===
    struct VisibleRange {
        int startIndex;      // 第一个可见文件索引
        int endIndex;        // 最后一个可见文件索引
        int bufferStart;     // 缓冲区开始
        int bufferEnd;       // 缓冲区结束
    };
    
    VisibleRange calculateVisibleRange(int scrollOffset, int windowHeight, 
                                       int itemHeight, int totalFiles) const;
    
    // === Item绑定管理 ===
    void bindItemToFile(CustomFileItem* item, int fileIndex);
    void unbindItem(CustomFileItem* item);
    int getFileIndexForItem(CustomFileItem* item) const;
    CustomFileItem* getItemForFileIndex(int fileIndex) const;
    
    // === 绑定状态 ===
    bool isItemBound(CustomFileItem* item) const;
    void clearAllBindings();
    
    // === 调试 ===
    int getBoundItemCount() const;
    QList<int> getBoundFileIndices() const;

signals:
    void poolSizeChanged(int newSize);
    void bindingChanged();

private:
    int m_poolSize;
    
    // Item → 文件索引映射
    QMap<CustomFileItem*, int> m_itemToFileIndex;
    
    // 文件索引 → Item映射（反向查找）
    QMap<int, CustomFileItem*> m_fileIndexToItem;
};

#endif // VIRTUALLISTMANAGER_H

